/**********************************Copyright (c)**********************************
**                       STM32F103 涂鸦WiFi模块测试
**
**                             测试实现文件
**
*********************************************************************************/
/**
 * @file    test.c
 * @author  User
 * @version v1.0.0
 * @date    2025.10.15
 * @brief   涂鸦WiFi模块测试函数实现
 *          参考: 串口协议_涂鸦开发者平台_涂鸦开发者平台.pdf
 */

#include "test.h"
#include "wifi.h"
#include <stdio.h>

/* 测试结果打印宏(可根据实际情况修改为串口输出) */
#define TEST_PRINTF(fmt, ...)   printf("[TEST] " fmt "\r\n", ##__VA_ARGS__)

/**
 * @brief  涂鸦WiFi模块初始化测试
 * @param  无
 * @return 无
 * @note   测试WiFi协议初始化
 */
void Test_Tuya_Init(void)
{
    TEST_PRINTF("=== 测试: WiFi协议初始化 ===");

    /* 调用涂鸦WiFi协议初始化 */
    wifi_protocol_init();

    TEST_PRINTF("WiFi协议初始化完成");
    TEST_PRINTF("产品ID: %s", PRODUCT_KEY);
    TEST_PRINTF("MCU版本: %s", MCU_VER);
    TEST_PRINTF("");
}

/**
 * @brief  测试查询产品信息
 * @param  无
 * @return 无
 * @note   模拟WiFi模块查询产品信息(命令字0x01)
 */
void Test_Product_Info(void)
{
    TEST_PRINTF("=== 测试: 查询产品信息 ===");

    /* 模拟WiFi模块发送查询产品信息命令
     * 帧格式: 55 AA 00 01 00 00 00
     * 帧头(55 AA) + 版本(00) + 命令字(01) + 数据长度(00 00) + 校验和(00)
     */
    uint8_t cmd[] = {0x55, 0xAA, 0x00, 0x01, 0x00, 0x00, 0x00};

    TEST_PRINTF("发送查询产品信息命令: 55 AA 00 01 00 00 00");

    /* 模拟串口接收数据 */
    for(uint16_t i = 0; i < sizeof(cmd); i++) {
        uart_receive_input(cmd[i]);
    }

    /* 调用数据处理服务 */
    wifi_uart_service();

    TEST_PRINTF("MCU应返回产品信息(PID和版本号)");
    TEST_PRINTF("");
}

/**
 * @brief  测试WiFi状态上报
 * @param  无
 * @return 无
 * @note   测试WiFi模块上报不同工作状态(命令字0x02)
 */
void Test_WiFi_State(void)
{
    TEST_PRINTF("=== 测试: WiFi状态上报 ===");

    /* 状态值定义:
     * 0x00: smartconfig配置状态
     * 0x01: AP配置状态
     * 0x02: WiFi已配置但未连上路由器
     * 0x03: WiFi已配置且连上路由器
     * 0x04: 已连上路由器且连接到云端
     */

    const char* state_str[] = {
        "smartconfig配置状态",
        "AP配置状态",
        "WiFi已配置但未连上路由器",
        "WiFi已配置且连上路由器",
        "已连上路由器且连接到云端"
    };

    /* 测试状态4: 已连接到云端 */
    uint8_t state = 0x04;

    /* 模拟WiFi模块发送状态上报
     * 帧格式: 55 AA 00 02 00 01 04 06
     * 校验和 = (55+AA+00+02+00+01+04) & 0xFF = 0x106 & 0xFF = 0x06
     */
    uint8_t cmd[] = {0x55, 0xAA, 0x00, 0x02, 0x00, 0x01, state, 0x06};

    TEST_PRINTF("WiFi模块上报状态: %s", state_str[state]);

    /* 模拟串口接收 */
    for(uint16_t i = 0; i < sizeof(cmd); i++) {
        uart_receive_input(cmd[i]);
    }

    wifi_uart_service();

    TEST_PRINTF("MCU应回复确认");
    TEST_PRINTF("");
}

/**
 * @brief  测试重置WiFi
 * @param  无
 * @return 无
 * @note   测试MCU重置WiFi功能(命令字0x03)
 */
void Test_WiFi_Reset(void)
{
    TEST_PRINTF("=== 测试: 重置WiFi ===");

#ifndef WIFI_CONTROL_SELF_MODE
    /* MCU主动发送重置WiFi命令 */
    TEST_PRINTF("MCU发送重置WiFi命令");
    mcu_reset_wifi();

    /* 模拟WiFi模块回复成功
     * 帧格式: 55 AA 00 03 00 00 02
     */
    uint8_t reply[] = {0x55, 0xAA, 0x00, 0x03, 0x00, 0x00, 0x02};

    TEST_PRINTF("WiFi模块回复: 重置成功");

    for(uint16_t i = 0; i < sizeof(reply); i++) {
        uart_receive_input(reply[i]);
    }

    wifi_uart_service();

    /* 检查重置标志 */
    if(mcu_get_reset_wifi_flag() == RESET_WIFI_SUCCESS) {
        TEST_PRINTF("重置WiFi成功");
    } else {
        TEST_PRINTF("重置WiFi失败");
    }
#else
    TEST_PRINTF("当前为WiFi自处理模式,MCU无需主动重置");
#endif

    TEST_PRINTF("");
}

/**
 * @brief  测试DP数据上报
 * @param  无
 * @return 无
 * @note   测试MCU上报传感器数据到云端(命令字0x05)
 */
void Test_DP_Upload(void)
{
    TEST_PRINTF("=== 测试: DP数据上报 ===");

    /* 测试上报各种类型的DP点 */

    /* 1. 上报VALUE类型: TDS值 */
    TEST_PRINTF("上报DP1(TDS值): 100 ppm");
    mcu_dp_value_update(DPID_TDS_IN, 100);

    /* 2. 上报VALUE类型: 温度 */
    TEST_PRINTF("上报DP2(温度): 25 ℃");
    mcu_dp_value_update(DPID_TEMP_CURRENT, 25);

    /* 3. 上报ENUM类型: 电池状态 */
    TEST_PRINTF("上报DP6(电池状态): 正常");
    mcu_dp_enum_update(DPID_BATTERY_STATE, 1);

    /* 4. 上报VALUE类型: 电池电量 */
    TEST_PRINTF("上报DP7(电池电量): 80%%");
    mcu_dp_value_update(DPID_BATTERY_PERCENTAGE, 80);

    /* 5. 上报BOOL类型: 防拆报警 */
    TEST_PRINTF("上报DP8(防拆报警): 关闭");
    mcu_dp_bool_update(DPID_TAMPER_ALARM, 0);

    /* 6. 上报VALUE类型: pH值 */
    TEST_PRINTF("上报DP10(pH值): 7.0");
    mcu_dp_value_update(DPID_PH, 7);

    TEST_PRINTF("等待WiFi模块回复上报结果...");
    TEST_PRINTF("");
}

/**
 * @brief  测试DP命令下发
 * @param  无
 * @return 无
 * @note   测试云端下发控制命令给MCU(命令字0x09)
 */
void Test_DP_Download(void)
{
    TEST_PRINTF("=== 测试: DP命令下发 ===");

    /* 模拟云端下发命令: 设置报警开关为开启
     * DP21(报警开关): BOOL型, 值为1(开启)
     *
     * 帧格式: 55 AA 00 09 00 05 15 01 00 01 01 XX
     * 数据部分: 15(DPID=21) 01(BOOL型) 00 01(长度=1) 01(值=1)
     * 校验和 = (55+AA+00+09+00+05+15+01+00+01+01) & 0xFF
     */
    uint8_t checksum = (0x55+0xAA+0x00+0x09+0x00+0x05+0x15+0x01+0x00+0x01+0x01) & 0xFF;
    uint8_t cmd[] = {0x55, 0xAA, 0x00, 0x09, 0x00, 0x05,
                     0x15, 0x01, 0x00, 0x01, 0x01, checksum};

    TEST_PRINTF("云端下发命令: 设置DP21(报警开关)=开启");

    /* 模拟串口接收 */
    for(uint16_t i = 0; i < sizeof(cmd); i++) {
        uart_receive_input(cmd[i]);
    }

    wifi_uart_service();

    TEST_PRINTF("MCU应处理命令并回复确认");
    TEST_PRINTF("");
}

/**
 * @brief  测试获取本地时间
 * @param  无
 * @return 无
 * @note   测试MCU从WiFi模块获取网络时间(命令字0x06)
 */
void Test_Get_Time(void)
{
    TEST_PRINTF("=== 测试: 获取本地时间 ===");

#ifdef SUPPORT_MCU_RTC_CHECK
    /* MCU发送获取时间命令 */
    TEST_PRINTF("MCU请求获取本地时间");
    mcu_get_system_time();

    /* 模拟WiFi模块返回时间
     * 时间: 2025年10月15日 14:30:25 星期三
     * 数据: 01(成功) 19(2025-2000) 0A(10月) 0F(15日) 0E(14时) 1E(30分) 19(25秒) 03(星期三)
     */
    uint8_t checksum = (0x55 + 0xAA + 0x00 + 0x06 + 0x00 + 0x08 + 0x01 + 0x19 + 0x0A + 0x0F + 0x0E + 0x1E + 0x19 + 0x03) & 0xFF;
    uint8_t reply[] = {0x55, 0xAA, 0x00, 0x06, 0x00, 0x08,
                       0x01, 0x19, 0x0A, 0x0F, 0x0E, 0x1E, 0x19, 0x03, checksum};

    TEST_PRINTF("WiFi模块返回时间: 2025-10-15 14:30:25 星期三");

    for(uint16_t i = 0; i < sizeof(reply); i++) {
        uart_receive_input(reply[i]);
    }

    wifi_uart_service();

    TEST_PRINTF("MCU应更新RTC时钟");
#else
    TEST_PRINTF("未开启RTC校时功能");
#endif

    TEST_PRINTF("");
}

/**
 * @brief  测试WiFi功能性测试
 * @param  无
 * @return 无
 * @note   测试WiFi模块扫描指定路由器(命令字0x07)
 */
void Test_WiFi_Function(void)
{
    TEST_PRINTF("=== 测试: WiFi功能性测试 ===");

#ifdef WIFI_TEST_ENABLE
    /* MCU发送WiFi测试命令 */
    TEST_PRINTF("MCU启动WiFi功能测试");
    TEST_PRINTF("扫描路由器SSID: tuya_mdev_test");
    mcu_start_wifitest();

    /* 模拟WiFi模块返回测试结果
     * 结果: 成功, 信号强度80
     * 数据: 01(成功) 50(80)
     */
    uint8_t checksum = (0x55+0xAA+0x00+0x07+0x00+0x02+0x01+0x50) & 0xFF;
    uint8_t reply[] = {0x55, 0xAA, 0x00, 0x07, 0x00, 0x02, 0x01, 0x50, checksum};

    TEST_PRINTF("WiFi模块返回: 测试成功, 信号强度80");

    for(uint16_t i = 0; i < sizeof(reply); i++) {
        uart_receive_input(reply[i]);
    }

    wifi_uart_service();
#else
    TEST_PRINTF("未开启WiFi功能测试");
#endif

    TEST_PRINTF("");
}

/**
 * @brief  测试查询路由信号强度
 * @param  无
 * @return 无
 * @note   测试查询当前连接的路由器信号强度(命令字0x0B)
 */
void Test_Route_RSSI(void)
{
    TEST_PRINTF("=== 测试: 查询路由信号强度 ===");

#ifdef WIFI_QUERY_ROUTE_RSSI
    /* MCU发送查询信号强度命令 */
    TEST_PRINTF("MCU查询当前路由器信号强度");
    qur_router_strenth();

    /* 模拟WiFi模块返回信号强度
     * 结果: 成功, 信号强度75
     * 数据: 01(成功) 4B(75)
     */
    uint8_t checksum = (0x55+0xAA+0x00+0x0B+0x00+0x02+0x01+0x4B) & 0xFF;
    uint8_t reply[] = {0x55, 0xAA, 0x00, 0x0B, 0x00, 0x02, 0x01, 0x4B, checksum};

    TEST_PRINTF("WiFi模块返回: 信号强度75");

    for(uint16_t i = 0; i < sizeof(reply); i++) {
        uart_receive_input(reply[i]);
    }

    wifi_uart_service();
#else
    TEST_PRINTF("未开启路由信号强度查询功能");
#endif

    TEST_PRINTF("");
}

/**
 * @brief  涂鸦WiFi模块综合测试
 * @param  无
 * @return 无
 * @note   执行所有测试项目
 */
void Test_Tuya_All(void)
{
    TEST_PRINTF("========================================");
    TEST_PRINTF("   涂鸦WiFi模块综合测试开始");
    TEST_PRINTF("========================================");
    TEST_PRINTF("");

    /* 1. 初始化测试 */
    Test_Tuya_Init();

    /* 2. 产品信息查询测试 */
    Test_Product_Info();

    /* 3. WiFi状态上报测试 */
    Test_WiFi_State();

    /* 4. WiFi重置测试 */
    Test_WiFi_Reset();

    /* 5. DP数据上报测试 */
    Test_DP_Upload();

    /* 6. DP命令下发测试 */
    Test_DP_Download();

    /* 7. 获取时间测试 */
    Test_Get_Time();

    /* 8. WiFi功能测试 */
    Test_WiFi_Function();

    /* 9. 查询信号强度测试 */
    Test_Route_RSSI();

    TEST_PRINTF("========================================");
    TEST_PRINTF("   涂鸦WiFi模块综合测试完成");
    TEST_PRINTF("========================================");
}

/**
 * @brief  模拟接收WiFi模块数据
 * @param[in] {data} 接收到的数据
 * @param[in] {len} 数据长度
 * @return 无
 * @note   用于测试时模拟串口接收
 */
void Test_Simulate_Receive(uint8_t *data, uint16_t len)
{
    if(data == NULL || len == 0) {
        return;
    }

    TEST_PRINTF("模拟接收数据, 长度: %d", len);

    /* 逐字节输入到涂鸦协议栈 */
    for(uint16_t i = 0; i < len; i++) {
        uart_receive_input(data[i]);
    }

    /* 处理接收的数据 */
    wifi_uart_service();
}

/* ========== 以下是更详细的单元测试函数 ========== */

/**
 * @brief  测试所有DP点上报
 * @param  无
 * @return 无
 * @note   调用all_data_update测试所有DP点上报
 */
void Test_All_DP_Upload(void)
{
    TEST_PRINTF("=== 测试: 所有DP点数据上报 ===");

    TEST_PRINTF("调用all_data_update()上报所有DP点");
    all_data_update();

    TEST_PRINTF("已上报所有DP点数据");
    TEST_PRINTF("");
}

/**
 * @brief  测试设置WiFi工作模式
 * @param  无
 * @return 无
 * @note   测试设置WiFi进入smartconfig或AP配置模式
 */
void Test_Set_WiFi_Mode(void)
{
    TEST_PRINTF("=== 测试: 设置WiFi工作模式 ===");

#ifndef WIFI_CONTROL_SELF_MODE
    /* 测试进入AP配置模式 */
    TEST_PRINTF("设置WiFi进入AP配置模式");
    mcu_set_wifi_mode(AP_CONFIG);

    /* 模拟WiFi模块回复成功 */
    uint8_t reply[] = {0x55, 0xAA, 0x00, 0x04, 0x00, 0x00, 0x03};

    for(uint16_t i = 0; i < sizeof(reply); i++) {
        uart_receive_input(reply[i]);
    }

    wifi_uart_service();

    if(mcu_get_wifimode_flag() == SET_WIFICONFIG_SUCCESS) {
        TEST_PRINTF("设置WiFi模式成功");
    } else {
        TEST_PRINTF("设置WiFi模式失败");
    }
#else
    TEST_PRINTF("当前为WiFi自处理模式");
#endif

    TEST_PRINTF("");
}
